From f32c51491d049d038e24d089560b2124128b4d22 Mon Sep 17 00:00:00 2001 From: robertl Date: Fri, 6 Feb 2004 04:02:05 +0000 Subject: [PATCH] From gtoevan@gmx.net: Add support for writing Garmin tracks. --- gpsbabel/garmin.c | 62 +++++++++++++++++++++++++++++++++++++++-- gpsbabel/jeeps/gpsmem.c | 2 +- gpsbabel/route.c | 8 ++++++ 3 files changed, 69 insertions(+), 3 deletions(-) diff --git a/gpsbabel/garmin.c b/gpsbabel/garmin.c index 80b00027b..4e1a88b92 100644 --- a/gpsbabel/garmin.c +++ b/gpsbabel/garmin.c @@ -30,6 +30,8 @@ static const char *portname; static void *mkshort_handle; GPS_PWay *tx_routelist; GPS_PWay *cur_tx_routelist_entry; +GPS_PTrack *tx_tracklist; +GPS_PTrack *cur_tx_tracklist_entry; static void rw_init(const char *fname) @@ -169,6 +171,9 @@ track_read(void) ntracks = GPS_Command_Get_Track(portname, &array); + if ( ntracks == 0 ) + return; + for(i = 0; i < ntracks; i++) { waypoint *wpt; @@ -454,6 +459,58 @@ route_write(void) GPS_Command_Send_Route(portname, tx_routelist, n); } +static void +track_hdr_pr(const route_head *trk_head) +{ + (*cur_tx_tracklist_entry)->tnew = gpsTrue; + (*cur_tx_tracklist_entry)->ishdr = gpsTrue; + if ( trk_head->rte_name ) { + strncpy((*cur_tx_tracklist_entry)->trk_ident, trk_head->rte_name, sizeof((*cur_tx_tracklist_entry)->trk_ident)); + (*cur_tx_tracklist_entry)->trk_ident[sizeof((*cur_tx_tracklist_entry)->trk_ident)-1] = 0; + } + cur_tx_tracklist_entry++; +} + +static void +track_waypt_pr(const waypoint *wpt) +{ + (*cur_tx_tracklist_entry)->lat = wpt->latitude; + (*cur_tx_tracklist_entry)->lon = wpt->longitude; + (*cur_tx_tracklist_entry)->alt = wpt->altitude; + (*cur_tx_tracklist_entry)->Time = wpt->creation_time; + if ( wpt->shortname ) { + strncpy((*cur_tx_tracklist_entry)->trk_ident, wpt->shortname, sizeof((*cur_tx_tracklist_entry)->trk_ident)); + (*cur_tx_tracklist_entry)->trk_ident[sizeof((*cur_tx_tracklist_entry)->trk_ident)-1] = 0; + } + cur_tx_tracklist_entry++; +} + +static void +track_write(void) +{ + int i; + /* Headers plus trackpoints. Trackpoints are added by + * route_add_waypt so get route_waypt_count() + */ + int n = route_waypt_count() + track_count(); + + tx_tracklist = xcalloc(n, sizeof(GPS_PTrack)); + cur_tx_tracklist_entry = tx_tracklist; + + for (i = 0; i < n; i++) { + tx_tracklist[i] = GPS_Track_New(); + } + + track_disp_all(track_hdr_pr, route_noop, track_waypt_pr); + + GPS_Command_Send_Track(portname, tx_tracklist, n); + + for (i = 0; i < n; i++) { + GPS_Track_Del(&tx_tracklist[i]); + } + xfree(tx_tracklist); +} + static void data_write() { @@ -464,8 +521,9 @@ data_write() case rtedata: route_write(); break; - default: - fatal(MYNAME ":writing tracks isn't supported\n"); + case trkdata: + track_write(); + break; } } diff --git a/gpsbabel/jeeps/gpsmem.c b/gpsbabel/jeeps/gpsmem.c index 0c9f51d0c..512d95877 100644 --- a/gpsbabel/jeeps/gpsmem.c +++ b/gpsbabel/jeeps/gpsmem.c @@ -182,7 +182,7 @@ GPS_PTrack GPS_Track_New(void) { GPS_PTrack ret; - if(!(ret=(GPS_PTrack)malloc(sizeof(GPS_OTrack)))) + if(!(ret=(GPS_PTrack)calloc(1,sizeof(GPS_OTrack)))) { perror("malloc"); fprintf(stderr,"GPS_Track_New: Insufficient memory"); diff --git a/gpsbabel/route.c b/gpsbabel/route.c index 3841d3521..70c6dd4ea 100644 --- a/gpsbabel/route.c +++ b/gpsbabel/route.c @@ -24,6 +24,7 @@ static queue my_route_head; static queue my_track_head; static int rte_head_ct; static int rte_waypts; +static int trk_head_ct; void route_init(void) @@ -45,6 +46,12 @@ route_count(void) return rte_head_ct; /* total # of routes */ } +unsigned int +track_count(void) +{ + return trk_head_ct; /* total # of tracks */ +} + route_head * route_head_alloc(void) { @@ -68,6 +75,7 @@ track_add_head(route_head *rte) { ENQUEUE_TAIL(&my_track_head, &rte->Q); QUEUE_INIT(&rte->waypoint_list); + trk_head_ct++; } void -- 2.30.2